package br.com.eduquiz.session;

import org.jboss.seam.annotations.In;
import org.jboss.seam.annotations.Logger;
import org.jboss.seam.annotations.Name;
import org.jboss.seam.log.Log;

import br.com.eduquiz.entity.AdministradorGrupo;
import br.com.eduquiz.entity.Grupo;
import br.com.eduquiz.entity.SubGrupo;
import br.com.eduquiz.entity.Usuario;

/**
 * Contém métodos para auxiliar na administração de permissões do seam
 * 
 * @author Joao Petreli
 *
 */
@Name("permissao")
public class Permissao {
	
	@Logger 
	@SuppressWarnings("unused")
    private Log log;
	
	@In(required=false, create=true)
	private Usuario usuario;
	
	@In(required=false, create=true)
	private UsuarioHome usuarioHome;
	
	@SuppressWarnings("unused")
	private Boolean usuarioSessao;
	
	@In(required=false, create=true)
	private SubGrupo subgrupo;
	
	@In(required=false, create=true)
	private SubGrupoHome subGrupoHome;

	@SuppressWarnings("unused")
	private Boolean subgrupoSessao;

	@In(required=false, create=true)
	private Grupo grupo;

	@In(required=false, create=true)
	private GrupoHome grupoHome;

	@SuppressWarnings("unused")
	private Boolean grupoSessao;
	
	@In(required=false, create=true)
	private AdministradorGrupo administradorGrupo;
	
	@In(required=false, create=true)
	private AdministradorGrupoHome administradorGrupoHome;

	@SuppressWarnings("unused")
	private Boolean administradorGrupoSessao;
	
	@In(required=false)
	private CategoriaHome categoriaHome;

	@SuppressWarnings("unused")
	private Boolean minhaCategoria;
	
	@In(required=false)
	private QuestionarioHome questionarioHome;
	
	@SuppressWarnings("unused")
	private Boolean meuQuestionario;

	@In(required=false)
	private QuestaoHome questaoHome;
	
	@SuppressWarnings("unused")
	private Boolean minhaQuestao;
	
	@In(required=false)
	private RespostaHome respostaHome;
	
	@SuppressWarnings("unused")
	private Boolean minhaResposta;

	public void setUsuarioSessao(boolean usuarioSessao) {
		this.usuarioSessao = usuarioSessao;
	}

	/**
	 * Verifica se o usuário da instância do EntityHome é o mesmo da autenticação
	 * 
	 * @return true se o usuário da instância do EntityHome for o mesmo da autenticação e false caso contrário
	 */
	public Boolean getUsuarioSessao() {
		if (usuarioHome.getUsuarioId()
				.equals(usuario.getId())) {
			return true;
		} else {
			return false;
		}
	}

	public void setSubgrupoSessao(Boolean subgrupoSessao) {
		this.subgrupoSessao = subgrupoSessao;
	}

	/**
	 * Verifica se o subgrupo da instância do EntityHome é o mesmo da autenticação
	 * 
	 * @return true se o subgrupo da instância do EntityHome for o mesmo da autenticação e false caso contrário
	 */
	public Boolean getSubgrupoSessao() {
		if (subGrupoHome.getSubGrupoId().equals(subgrupo.getId())) {
			return true;
		} else {
			return false;
		}
	}

	public void setGrupoSessao(Boolean grupoSessao) {
		this.grupoSessao = grupoSessao;
	}

	/**
	 * Verfica se determinado grupo é o mesmo que está tentando modificar o grupo corrente
	 * 
	 * @return true se o grupo da instância do EntityHome for o mesmo da autenticação e false caso contrário
	 */
	public Boolean getGrupoSessao() {
		if (grupoHome.getGrupoId().equals(grupo.getId())) {
			return true;
		} else {
			return false;
		}
	}

	public void setAdministradorGrupoSessao(Boolean administradorGrupoSessao) {
		this.administradorGrupoSessao = administradorGrupoSessao;
	}
	
	/**
	 * Verfica se determinado administrador de grupo é o mesmo que está tentando modificar o administrador de grupo corrente
	 * 
	 * @return true se o administrador de grupo da instância do EntityHome for o mesmo da autenticação e false caso contrário
	 */
	public Boolean getAdministradorGrupoSessao() {
		if (administradorGrupoHome.getAdministradorGrupoId()
				.equals(administradorGrupo.getId())) {
			return true;
		} else {
			return false;
		}
	}

	public void setMinhaCategoria(Boolean minhaCategoria) {
		this.minhaCategoria = minhaCategoria;
	}

	public Boolean getMinhaCategoria() {
		try {
			if (usuario.getId().equals(
					categoriaHome.getInstance().getUsuario().getId()
					)) {
				return true;
			} else {
				return false;
			}
		} catch (NullPointerException e) {
			return true;
		}
	}

	public void setMeuQuestionario(Boolean meuQuestionario) {
		this.meuQuestionario = meuQuestionario;
	}

	/**
	 * Verifica se o questionário que o usuário está tentando editar pertence a ele,
	 * caso não exista a instância de questionarioHome, isso significa que o usuário
	 * não está editando algum questionário e sim tentando criar um novo, logo será
	 * lançado uma NullPointerException e retornado true para o usuário poder criar
	 * um novo questionário.
	 * @return
	 */
	public Boolean getMeuQuestionario() {
		try {
			if (usuario.getId().equals(
					questionarioHome.getInstance().getUsuario().getId()
					)) {
				return true;
			} else {
				return false;
			}
		} catch (NullPointerException e) {
			return true;
		}
	}

	public void setMinhaQuestao(Boolean minhaQuestao) {
		this.minhaQuestao = minhaQuestao;
	}

	public Boolean getMinhaQuestao() {
		try {
			if (usuario.getId().equals(
					questaoHome.getInstance().getQuestionario().getUsuario().getId()
					)) {
				return true;
			} else {
				return false;
			}
		} catch (NullPointerException e) {
			return true;
		}
	}

	public void setMinhaResposta(Boolean minhaResposta) {
		this.minhaResposta = minhaResposta;
	}

	public Boolean getMinhaResposta() {
		try {
			if (usuario.getId().equals(
					respostaHome.getInstance().getQuestao().getQuestionario().getUsuario().getId() // uffa
					)) {
				return true;
			} else {
				return false;
			}
		} catch (NullPointerException e) {
			return true;
		}
	}
}
